#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :file_preview.py
# @Time      :2024/10/15 18:17
# @Author    :zhou_yi

import streamlit as st
import os


# 滚动加载文本文件
def load_text_file_with_scroll(file_path):
    """支持滚动加载的文本文件预览"""
    CHUNK_SIZE = 1000  # 每次加载的字符数
    with open(file_path, "r", encoding="utf-8") as f:
        # 初始化状态，保存已经加载的内容
        if 'file_offset' not in st.session_state:
            st.session_state.file_offset = 0
            st.session_state.file_chunk = ""

        # 读取当前文件块
        f.seek(st.session_state.file_offset)
        chunk = f.read(CHUNK_SIZE)
        st.session_state.file_chunk += chunk
        st.session_state.file_offset = f.tell()

        # 显示当前已加载的内容
        st.text(st.session_state.file_chunk)

        # 如果没有加载完全部文件，显示“加载更多”按钮
        if chunk:
            if st.button("加载更多"):
                load_text_file_with_scroll(file_path)
        else:
            st.info("文件已完全加载")


# 文件预览
def preview_0(file_path):
    file_ext = os.path.splitext(file_path)[1].lower()

    try:
        if file_ext in [".txt", ".md", ".py", ".csv"]:  # 文本文件
            with open(file_path, "r", encoding="utf-8") as f:
                st.text(f.read())
        elif file_ext in [".jpg", ".jpeg", ".png", ".gif"]:  # 图片文件
            st.image(file_path)
        elif file_ext in [".mp4", ".avi", ".mov"]:  # 视频文件
            st.video(file_path)
        elif file_ext in [".mp3", ".wav"]:  # 音频文件
            st.audio(file_path)
        else:
            st.warning("不支持的文件类型预览")
    except Exception as e:
        st.error(f"无法预览文件：{str(e)}")


# 滚动加载文件数据
def preview_1(file_path):
    file_ext = os.path.splitext(file_path)[1].lower()

    try:
        if file_ext in [".txt", ".md", ".py", ".csv"]:  # 文本文件滚动加载
            load_text_file_with_scroll(file_path)
        elif file_ext in [".jpg", ".jpeg", ".png", ".gif"]:  # 图片文件
            st.image(file_path)
        elif file_ext in [".mp4", ".avi", ".mov"]:  # 视频文件
            st.video(file_path)
        elif file_ext in [".mp3", ".wav"]:  # 音频文件
            st.audio(file_path)
        else:
            st.warning("不支持的文件类型预览")
    except Exception as e:
        st.error(f"无法预览文件：{str(e)}")


# 递归展示文件夹结构
def display_folder_structure(folder, level=0):
    for item in os.listdir(folder):
        item_path = os.path.join(folder, item)
        if os.path.isdir(item_path):
            # 显示文件夹名并递归显示其子文件夹
            st.markdown(f"{'  ' * level}📂 **{item}**")
            display_folder_structure(item_path, level + 1)
        else:
            # 显示文件名并添加文件预览按钮
            st.markdown(f"{'  ' * level}📄 {item}")
            with st.expander(f"预览 {item}"):
                preview_1(item_path)


if __name__ == '__main__':
    st.title('文件预览')

    # 获取文件夹路径
    root_dir = st.text_input("请输入文件夹路径", value=".")

    # 显示文件夹结构
    if os.path.isdir(root_dir):
        display_folder_structure(root_dir)
    else:
        st.error("文件夹路径无效，请重新输入。")
    ...
